Veri manipulasyonu, veriyi amaca yonelik okunabilir ve düzenli hale getirmektir.Yapilari parca parca,anlasilabilir,okunabilir ve basit bir sekilde ifade etme yaklasiminda olmaliyiz.
. Mumkun oldugu kadar var olan veri yapilarini kullan.
. Pipe ile basit fonksiyonlar olustur:Buyuk problemleri kucuk parcalara ayirarak coz.
. Fonksiyonel programlamayı benimse.
. Insanlar icin tasarla: Temiz ve okunabilir kod yaz.
. Karmasik islemleri birbirine baglamak.
. Kendisinden onceki yapinin ciktisini, kendisinden bir sonraki yapiya girdi olarak atanmasini saglamaktadir.
Bir pense veya ingiliz anahtari esprisinden yola cikarak dusunebiliriz.Veri manipulasyonun grameri olarak adlandirilmistir.Veri manipulasyonu, veri gorsellestirme ve kesifci veri analizi gibi konularda kullanilmaktadir.
Tidy Data, her bir satir elemaninin gozlem birimini, her bir sutun elemaninin da degiskeni temsil ettigi veri tipidir.
Satir –> Gozlem
Sutun –> Degisken
. gather()
. spread()
. seperate()
. unite()
select() : degisken secimi
filter() : gozlem secimi
mutate() : degisken olusturma
summarise() : ozet istatistikler
group_by() : gruplama
left_join() : birlestirme islemleri
summarise() : veri ozetleme
nycflights13 - New York City’e ait 2013 yilinin ucus verileri
# Kutuphane icerisinden veri seti secme ve dataframe olarak atama
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.0.5
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(nycflights13)
## Warning: package 'nycflights13' was built under R version 4.0.5
df <- flights
df
str(df)
## tibble[,19] [336,776 x 19] (S3: tbl_df/tbl/data.frame)
## $ year : int [1:336776] 2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 ...
## $ month : int [1:336776] 1 1 1 1 1 1 1 1 1 1 ...
## $ day : int [1:336776] 1 1 1 1 1 1 1 1 1 1 ...
## $ dep_time : int [1:336776] 517 533 542 544 554 554 555 557 557 558 ...
## $ sched_dep_time: int [1:336776] 515 529 540 545 600 558 600 600 600 600 ...
## $ dep_delay : num [1:336776] 2 4 2 -1 -6 -4 -5 -3 -3 -2 ...
## $ arr_time : int [1:336776] 830 850 923 1004 812 740 913 709 838 753 ...
## $ sched_arr_time: int [1:336776] 819 830 850 1022 837 728 854 723 846 745 ...
## $ arr_delay : num [1:336776] 11 20 33 -18 -25 12 19 -14 -8 8 ...
## $ carrier : chr [1:336776] "UA" "UA" "AA" "B6" ...
## $ flight : int [1:336776] 1545 1714 1141 725 461 1696 507 5708 79 301 ...
## $ tailnum : chr [1:336776] "N14228" "N24211" "N619AA" "N804JB" ...
## $ origin : chr [1:336776] "EWR" "LGA" "JFK" "JFK" ...
## $ dest : chr [1:336776] "IAH" "IAH" "MIA" "BQN" ...
## $ air_time : num [1:336776] 227 227 160 183 116 150 158 53 140 138 ...
## $ distance : num [1:336776] 1400 1416 1089 1576 762 ...
## $ hour : num [1:336776] 5 5 5 5 6 5 6 6 6 6 ...
## $ minute : num [1:336776] 15 29 40 45 0 58 0 0 0 0 ...
## $ time_hour : POSIXct[1:336776], format: "2013-01-01 05:00:00" "2013-01-01 05:00:00" ...
summary(df)
## year month day dep_time sched_dep_time
## Min. :2013 Min. : 1.000 Min. : 1.00 Min. : 1 Min. : 106
## 1st Qu.:2013 1st Qu.: 4.000 1st Qu.: 8.00 1st Qu.: 907 1st Qu.: 906
## Median :2013 Median : 7.000 Median :16.00 Median :1401 Median :1359
## Mean :2013 Mean : 6.549 Mean :15.71 Mean :1349 Mean :1344
## 3rd Qu.:2013 3rd Qu.:10.000 3rd Qu.:23.00 3rd Qu.:1744 3rd Qu.:1729
## Max. :2013 Max. :12.000 Max. :31.00 Max. :2400 Max. :2359
## NA's :8255
## dep_delay arr_time sched_arr_time arr_delay
## Min. : -43.00 Min. : 1 Min. : 1 Min. : -86.000
## 1st Qu.: -5.00 1st Qu.:1104 1st Qu.:1124 1st Qu.: -17.000
## Median : -2.00 Median :1535 Median :1556 Median : -5.000
## Mean : 12.64 Mean :1502 Mean :1536 Mean : 6.895
## 3rd Qu.: 11.00 3rd Qu.:1940 3rd Qu.:1945 3rd Qu.: 14.000
## Max. :1301.00 Max. :2400 Max. :2359 Max. :1272.000
## NA's :8255 NA's :8713 NA's :9430
## carrier flight tailnum origin
## Length:336776 Min. : 1 Length:336776 Length:336776
## Class :character 1st Qu.: 553 Class :character Class :character
## Mode :character Median :1496 Mode :character Mode :character
## Mean :1972
## 3rd Qu.:3465
## Max. :8500
##
## dest air_time distance hour
## Length:336776 Min. : 20.0 Min. : 17 Min. : 1.00
## Class :character 1st Qu.: 82.0 1st Qu.: 502 1st Qu.: 9.00
## Mode :character Median :129.0 Median : 872 Median :13.00
## Mean :150.7 Mean :1040 Mean :13.18
## 3rd Qu.:192.0 3rd Qu.:1389 3rd Qu.:17.00
## Max. :695.0 Max. :4983 Max. :23.00
## NA's :9430
## minute time_hour
## Min. : 0.00 Min. :2013-01-01 05:00:00
## 1st Qu.: 8.00 1st Qu.:2013-04-04 13:00:00
## Median :29.00 Median :2013-07-03 10:00:00
## Mean :26.23 Mean :2013-07-03 05:22:54
## 3rd Qu.:44.00 3rd Qu.:2013-10-01 07:00:00
## Max. :59.00 Max. :2013-12-31 23:00:00
##
# Hepsinin icinde oldugu ornek bir calisma
df %>%
select(dep_delay, day, carrier) %>%
filter(dep_delay > 10) %>%
group_by(carrier) %>%
summarise(ucus_sayisi = n(),
ortalama = mean(dep_delay))
# Veri seti icerisinden degisken secme : select fonks.ilk arguman olarak veri setini daha sonra ise secilecek olan degisken isimleri girilir.
select(df, carrier, flight, tailnum)
# Aralik belirterekte degisken secebiliriz.
select(df, carrier, origin:hour)
# Sayiya indeksleyerek degisken secme
select(df, 1:4)
# Gorunmesini istemedigimiz degiskenin basina - koyarak secim yapabiliriz.
select(df, -carrier)
# Birden fazla degiskeni disarida bırakmak istersek eger
select(df, -c(tailnum, carrier))
# Aralik belirtererkte birden fazla degiskeni disarida birakabiliriz.
select(df, -c(origin:hour))
Veri seti icerisindeki degiskenlerden sadece bizim istedigimiz isim ya da ifadeyi barindiran degiskenleri secmek istedigimizde onları veri setinde aratarak erisebiliriz.
select(df, contains("time")) # icerisinde time gecen degiskenler
select(df, starts_with("dep"))
select(df, ends_with("delay"))
m <- matrix(1:25, 5, 5)
colnames(m) <- paste("x",1:5, sep ="")
select(as.data.frame(m), num_range("x",1:3))
# dplyr fonksiyonlarinin birinci argumanlari dataframe'den olusman zorunda oldugundan dolayı m matrisine cevirme islemi uyguladik.
# Hem degisken isimleri ile hemde bir fonksiyon ile degisken secimi yapabiliriz.
select(df, carrier, tailnum, contains("time"))
filter(df, year == 2013 & month == 2 & day == 26)
filter(df, dep_delay > 1000)
filter(df, dep_delay > mean(df$dep_delay, na.rm = TRUE) + sd(df$dep_delay, na.rm = TRUE)) # gecikme zamani ortalamasi ile standart sapma degerinin toplamindan buyuk olan gecikme zamani gozlem degerleri
# arrange() fonksiyonu gozlemleri belirtildigi sirada kucukten buyuge ya da buyukten kucuge siralamaya yaramaktadir.
a <- select(df, dep_delay, month, day) # degisken secme ve atama yapma
arrange(a, dep_delay, month, day) # kucukten buyuge
b <- arrange(a, desc(dep_delay), month, day) # buyukten kucuge
c <- filter(b, dep_delay > 0)
# Yukarida tek tek atama ile gerceklestirdigimiz islemleri pipe/chain operatoru (%>%) ile gerceklestirebiliriz.
df %>%
filter(month == 2, day ==18) %>%
select(dep_delay, month) %>%
arrange(desc(dep_delay),month)
# Belirli bir oranda rastgele degisken secimi yapmaktadir.Yerine koyma veya koymama durumu belirtilebilir.
df %>% sample_frac(0.05)
# Yine rastgele secim yapmaktadir fakat belirtilen bir deger vardir.
df %>% sample_n(100)
# Pozisyona gore secim imkani saglamaktadir.
df %>% slice(199:299)
# İlk n degiskeni secmek icin kullanilmaktadir.
df %>% top_n(5)
## Selecting by time_hour
# Mutate() fonksyionu yeni bir degisken olusturmaya yaramaktadir.Mutate() fonksiyonun ilk argumani veri seti, daha sonra olusturulacak olan yeni degiskenin adinin ne oldugu ve nasıl olacagı ifade edilmelidir.
sample <- df %>%
sample_n(1000) %>%
select(arr_delay, dep_delay, distance, arr_time)
# Ornek olarak bir senaryo dusunelim.Kalkıs olarak eksi konumda bulunan yani gec kalkmıs olan bir pilotun varıs zamani arti konumda ise bu kazanci hesap eden (varis zamani - kalkis zamani) bir degiskeni yok.Bunu olusturdugumuz dusenelim.Diger bir yandan ucaklarin hizini da hesaplamak istedigimiz dusunelim.(uzaklık / varis_zamani * 60)
mutate(sample,
kazanc = arr_delay - dep_delay,
hiz = distance / arr_time * 60)
# mutate() fonksiyonunu kullanmadan yeni bir degisken olusturarak isim vermeden de isimlendirme yapabiliriz.
rename(df,
varis_gecikmesi = arr_delay,
kalkis_gecikmesi = dep_delay)
# Yeni bir degisken olustururken eski degiskenleri gormek istemiyorsak bu durumda transmute fonksiyonu kallanilir.
transmute(sample,
kazanc = arr_delay - dep_delay,
hiz = distance / arr_time * 60)
# Verimiz icerisindeki kategorik degiskenlere gore veriyi gruplamak icin kullanilmaktadir.Ornegin; cinsiyet,il vb.
df %>% group_by(carrier) %>%
summarise(ucus_sayi = n(),
ortalama_gecikme = mean(dep_delay, na.rm = TRUE),
medyan = median(dep_delay, na.rm = TRUE),
standart_sapma = sd(dep_delay, na.rm = TRUE),
varyans = var(dep_delay, na.rm = TRUE),
ortalama_uzaklik = mean(distance, na.rm = TRUE))
Veri ozetleme fonksiyonları genellikle gruplama fonksiyonları ile beraber kullanilmaktadir. Betimsel istatisler icin asagidaki fonksiyonlar ihtiyac durumuna gore kullanilmaktadir.
. summarise()
. mean(), median(), sum(), sd(), var()
. first(), last(), nth()
. quantile(), min(), max()
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.0.5
## -- Attaching packages --------------------------------------- tidyverse 1.3.1 --
## v ggplot2 3.3.3 v purrr 0.3.4
## v tibble 3.1.1 v stringr 1.4.0
## v tidyr 1.1.3 v forcats 0.5.1
## v readr 1.4.0
## Warning: package 'tibble' was built under R version 4.0.5
## Warning: package 'tidyr' was built under R version 4.0.5
## Warning: package 'readr' was built under R version 4.0.5
## Warning: package 'purrr' was built under R version 4.0.5
## Warning: package 'stringr' was built under R version 4.0.5
## Warning: package 'forcats' was built under R version 4.0.5
## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag() masks stats::lag()
table1 # duzenli veri
table2 # duzensiz veri
table3 # duzensiz veri - rate degiskeni olusturulmus(cases / population)
table4a # duzensiz veri - yıl degerleri degisken ismi haline donusmus
table4b # duzensiz veri
# Getirmesini istedigimiz yani toplamak istediğimiz degiskenleri ifade ediyoruz. key degeri ile bu degiskenlere isim atamasi yapiyoruz ve daha sonra gozlem degerleri hangi degiskene ait ise onu belirtiyoruz.
table4a %>% gather(`1999`,`2000`, key = "year", value = "cases")
# yillarin altına dusen degerler population degerlerini gostermektedir.Bır onceki ornek tabloda oldugu gibi yillar degisken haline gelmis. Simdi bu durumu duzenli hale getirecegiz.
table4b %>% gather(`1999`,`2000`, key = "year", value = "population")
# Join islemlerine ornek olmasi icin iki tabloyu birlestirecegiz.
tidy_a <- table4a %>% gather(`1999`,`2000`, key = "year", value = "cases")
tidy_b <- table4b %>% gather(`1999`,`2000`, key = "year", value = "population")
left_join(tidy_a, tidy_b)
## Joining, by = c("country", "year")
# gather() fonksiyonun tersidir.Oncekinde degisken isimlerinde degiskenlerin degerleri vardır.Burada ise satirlarda degiskenkenlerin kendileri var ve yanlarindan bu degiskenlerin degerleri var.
# Gitmesini istedigimiz degisken ismini key degerine, degerlerin oldugu degisken ismini ise value kismina giriyoruz.
table2
spread(table2, key = "type", value = "count" )
# Bir degiskenin degerini iki degiskenin degeri olarak donusturulme durumundan sonra bunlari ayirmak icin kullanilir.
table3 %>%
separate(rate, into = c("cases","population"), sep = "/", convert = TRUE)
# Yukarida ki kod kisminda table3 degerinde birlesik iki degere sahip olan rate degiskenini into kisminda ise ayirmak istedigimiz iki degiskenin isimlerini ve nasil ayirmak istedigimizi belirttik. convert argumani ile de kendisi bu degiskenleri olasi en iyi degiskene cevirmektedir.
# Var olan iki degiskenin degerlerini bir araya getirerek anlamli bir birlesme yapilmak isteniyorsa kullanilmaktadir.
table5 %>%
unite(yil, century, year, sep = "")
# Yukarida ki kod kisminda unite fonksiyonu icerisine ilk once yeni degisken ismini, daha sonra birlestirilcek kolonları ve birlestirme seklini belirtiyoruz.